function* rootSaga() {
  console.log('start')
  yield { type: "PUT", action: { type: "ADD" } }
  yield new Promise(resolve => setTimeout(resolve, 1000)) // 1秒后让 promise 成功
  yield `delay1000`
  yield readFile
  yield { type: "PUT", action: { type: "MINUS" } }

}

function readFile(callback) { // callback 是 next 用于执行下一个 saga
  console.log('回调函数中的逻辑 2秒后执行下一个 saga')
  setTimeout(callback, 1000 * 2)
}

// 内部执行 saga
function runSaga(saga) {
  const it = saga() // 执行生成器 返回一个迭代器
  function next() {
    const {
      done, // 标识当前 saga 是否执行完毕 ( true 代表执行完毕 )
      value: effect,  // 副作用
    } = it.next() // 调用迭代器的 next 方法
    if (!done) { // 代表当前 saga 没有执行完毕
      if (effect.type === "PUT") {
        console.log(`向仓库派发一个动作 ${JSON.stringify(effect.action)}`)
        next() // 执行下一个 saga
      } else if (typeof effect === 'function') {
        effect(next) // 由回调函数来决定何时执行下一个 saga
      } else if (effect === 'delay1000') {
        console.log('delay1000 字符串')
        next() // 执行下一个 saga
      } else if (effect instanceof Promise) {
        effect.then(next) // 当 promise 成功后 执行下一个 saga
      } else {
        next() // 其他的情况就执行 下一个 saga
      }
    }
  }

  next()
}

runSaga(rootSaga)
